﻿/* Created on 2017.3.25
 *
 * @author: jia
 */

#pragma once
#include <list>
#include <mutex>

template <typename T>
class KBEObjectPool
{
public:
    static T* createObject()
    {
        mtx.lock();
        std::lock_guard<std::mutex> lck(mtx, std::adopt_lock);

        if (!objects->empty())
        {
            T* v = objects->front();
            objects->pop_front();
            return v;
        }
        else
        {
            return new T();
        }
    }

    static void reclaimObject(T* item)
    {
        mtx.lock();
        objects->push_back(item);
        mtx.unlock();
    }

private:
    static std::list<T*> *objects;
    static std::mutex mtx;
};

/*
   对于class的static member，其实只是声明了一个scope, 既然是声明而已，所以还需要一个定义.
   之所以需要在类的外面，因为本质来说它和global和static变量没什么区别，都是在数据段的，只是scope不一样，属于class而已。
   TODO: objects的释放
*/
template <typename T>
std::mutex KBEObjectPool<T>::mtx;

template <typename T>
std::list<T*> *KBEObjectPool<T>::objects = new std::list<T*>();
